package org.monster.context.core.file;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件调用者
 *
 * @author Monster
 */
public class FileInvoker {

    /**
     * 文件命令
     */
    private static final List<FileCommand> commands = new ArrayList<>();

    /**
     * 静态代码块
     */
    static {
        commands.add(new FileBaseCommand());
        commands.add(new FileRemoveCommand());
        commands.add(new FileAddCommand());
        commands.add(new FileUpdateCommand());
    }

    /**
     * 获取 命令
     *
     * @param i 索引
     * @return
     */
    public FileCommand getCommands(int i) {
        return commands.get(i);
    }

    /**
     * 获取 命令
     *
     * @param file    文件
     * @param set     文件 集合
     * @param catalog 文件目录
     * @return 文件命令
     */
    public FileCommand getCommand(File file, FileSet set,
                                  FileCatalog catalog) {
        if (file.isFile()) {
            set.add(file.getAbsolutePath());
            Long lastModified = catalog.get(file.getAbsolutePath());
            if (lastModified == null) {
                return getCommands(2);
            } else if (file.lastModified() != lastModified) {
                return getCommands(3);
            }
        }
        return null;
    }

    /**
     * 执行
     *
     * @param file    文件
     * @param set     文件 集合
     * @param catalog 文件目录
     */
    public void execute(File file, FileSet set, FileCatalog catalog) {
        for (int i = 0; i < commands.size() - 2; i++) {
            FileCommand command = commands.get(i);
            command.check(file, set, catalog, this);
        }
    }
}
